home *** CD-ROM | disk | FTP | other *** search
/ Aminet 48 / Aminet 48 (2002)(GTI - Schatztruhe)[!][Apr 2002].iso / Aminet / dev / src / expat-src.lha / expat-1.95.2 / xmlwf / win32filemap.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-28  |  2.0 KB  |  96 lines

  1. /*
  2. Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
  3. See the file COPYING for copying permission.
  4. */
  5.  
  6. #define STRICT 1
  7. #define WIN32_LEAN_AND_MEAN 1
  8.  
  9. #ifdef XML_UNICODE_WCHAR_T
  10. #ifndef XML_UNICODE
  11. #define XML_UNICODE
  12. #endif
  13. #endif
  14.  
  15. #ifdef XML_UNICODE
  16. #define UNICODE
  17. #define _UNICODE
  18. #endif /* XML_UNICODE */
  19. #include <windows.h>
  20. #include <stdio.h>
  21. #include <tchar.h>
  22. #include "filemap.h"
  23.  
  24. static void win32perror(const TCHAR *);
  25.  
  26. int filemap(const TCHAR *name,
  27.         void (*processor)(const void *, size_t, const TCHAR *, void *arg),
  28.         void *arg)
  29. {
  30.   HANDLE f;
  31.   HANDLE m;
  32.   DWORD size;
  33.   DWORD sizeHi;
  34.   void *p;
  35.  
  36.   f = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  37.               FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  38.   if (f == INVALID_HANDLE_VALUE) {
  39.     win32perror(name);
  40.     return 0;
  41.   }
  42.   size = GetFileSize(f, &sizeHi);
  43.   if (size == (DWORD)-1) {
  44.     win32perror(name);
  45.     return 0;
  46.   }
  47.   if (sizeHi) {
  48.     _ftprintf(stderr, _T("%s: bigger than 2Gb\n"), name);
  49.     return 0;
  50.   }
  51.   /* CreateFileMapping barfs on zero length files */
  52.   if (size == 0) {
  53.     static const char c = '\0';
  54.     processor(&c, 0, name, arg);
  55.     CloseHandle(f);
  56.     return 1;
  57.   }
  58.   m = CreateFileMapping(f, NULL, PAGE_READONLY, 0, 0, NULL);
  59.   if (m == NULL) {
  60.     win32perror(name);
  61.     CloseHandle(f);
  62.     return 0;
  63.   }
  64.   p = MapViewOfFile(m, FILE_MAP_READ, 0, 0, 0);
  65.   if (p == NULL) {
  66.     win32perror(name);
  67.     CloseHandle(m);
  68.     CloseHandle(f);
  69.     return 0;
  70.   }
  71.   processor(p, size, name, arg); 
  72.   UnmapViewOfFile(p);
  73.   CloseHandle(m);
  74.   CloseHandle(f);
  75.   return 1;
  76. }
  77.  
  78. static
  79. void win32perror(const TCHAR *s)
  80. {
  81.   LPVOID buf;
  82.   if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  83.             NULL,
  84.             GetLastError(),
  85.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  86.             (LPTSTR) &buf,
  87.             0,
  88.             NULL)) {
  89.     _ftprintf(stderr, _T("%s: %s"), s, buf);
  90.     fflush(stderr);
  91.     LocalFree(buf);
  92.   }
  93.   else
  94.     _ftprintf(stderr, _T("%s: unknown Windows error\n"), s);
  95. }
  96.